package top.wangjiu.java.jvm.accessflag;

import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

/**
 * ACC_PUBLIC	0x0001	public，表示字段可以从任何包访问。
 * ACC_PRIVATE	0x0002	private，表示字段仅能该类自身调用。
 * ACC_PROTECTED	0x0004	protected，表示字段可以被子类调用。
 * ACC_STATIC	0x0008	static，表示静态字段。
 * ACC_FINAL	0x0010	final，表示字段定义后值无法修改
 * ACC_VOLATILE	0x0040	volatile，表示字段是易变的。
 * ACC_TRANSIENT	0x0080	transient，表示字段不会被序列化
 * ACC_SYNTHETIC	0x1000	表示字段由编译器自动产生。
 * ACC_ENUM	0x4000	enum，表示字段为枚举类型
 *
 */
public enum FieldAccessFlag {

    ACC_PUBLIC(1),
    ACC_PRIVATE(2),
    ACC_PROTECTED(4),
    ACC_STATIC(8),
    ACC_FINAL(1<<4),
    ACC_VOLATILE(4<<4),
    ACC_TRANSIENT(8<<4),
    ACC_SYNTHETIC(1<<12),
    ACC_ENUM(4<<12),
    ;

    @Getter
    private final short flag;

    FieldAccessFlag(int flag){
        this.flag = (short) flag;
    }

    public static FieldAccessFlag[] parseAccessFlags(short accessFlags){
        List<FieldAccessFlag> list = new ArrayList<>();
        for (FieldAccessFlag value : FieldAccessFlag.values()) {
            if((value.flag & accessFlags) == value.flag){
                list.add(value);
            }
        }
        return list.toArray(new FieldAccessFlag[list.size()]);
    }

    @Override
    public String toString() {
        return this.name();
    }
}
